feat!: drop legacy central tunnel support (fallbacks + image gate) - #504
feat!: drop legacy central tunnel support (fallbacks + image gate)#504venkatamutyala wants to merge 4 commits into
Conversation
Removes DEFAULT_TUNNEL_ENDPOINT and every fallback to it: the access URL is always <name>.<region>.tunnels.cde..., getTunnelEndpoint throws when a region has no usable endpoint (creation fails cleanly instead of advertising a dead URL), and the REGIONAL_TUNNEL_MIN_IMAGE_TAG image gate is gone along with its env var. /vm list renders no access link for a CDE VM that predates the tunnel_endpoint tag, since there is no longer a host it could point at. BREAKING CHANGE: every region must declare tunnel_endpoint, and only images that read /etc/glueops/tunnel_endpoint may be offered. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01ErBUiAYTosnpbF9hvUj3Dn
Those VMs bind under a cde- prefix on the old host, so building a URL from the tag alone advertised a link that resolves to nothing. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01ErBUiAYTosnpbF9hvUj3Dn
Multi-agent review of the legacy-removal PRs (4 reviewers, findings adversarially verified)23 raw findings → 7 confirmed. The headline one was a self-inflicted regression, now fixed:
Deliberately not changed (verified as intended behavior): the hard-fail on a transient Merge order remains the operative risk, and it is unchanged: provisioner first (after every region declares 🤖 Generated with Claude Code |
getTunnelEndpoint now rejects tunnels.glueopshosted.com so the create path fails as loudly as /vm list already renders (the constant moved here and is shared). Transport errors, timeouts and a region briefly absent from /v1/regions are tagged transient, so the user is asked to retry instead of being told their region is misconfigured and to escalate. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01ErBUiAYTosnpbF9hvUj3Dn
Final review — lead reviewers + requested specialists (29 agents, findings adversarially verified)23 raw findings → 10 confirmed → all fixed. Structure: four lead reviewers (one per PR + a cross-repo seams lead) each assessed the post-fix branches and requested domain specialists; the specialists they asked for (GlueOps deployment config; sish flag semantics as actually deployed) were fanned out and settled their questions empirically; everything then went through adversarial verification. The previous round's five fixes were re-verified as correct — the Fixed in this round
Correction to PR #554's precondition (please read before merging)The stated precondition — "the slackbot writes
🤖 Generated with Claude Code |
A rotated PROVISIONER_API_TOKEN answers 401, which was being reported to users as "please try again" forever instead of routing to the escalate path, and the re-wrapped error made the log line lose status and body. Classify on the response and carry the original as cause. Also corrects the cloud-init comment that still described the deleted fallback. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01ErBUiAYTosnpbF9hvUj3Dn
Round 3 — six-lens sweep + completeness critic (28 agents, adversarially verified)21 raw findings → 9 confirmed → all fixed. Zero critical, zero major (round 1 had a critical, round 2 a major), and the nine deduplicated to five real issues — three independent lenses landed on the same transient-tagging defect, two on the same stale comment. That convergence is the signal this has bottomed out. Fixed
One correction for PR #504's body (not code)Decommission precondition 4 says to check the central sish's admin console — that box does not run AssessmentThree rounds, 84 agents: critical → major → all-minor, with the last round's findings concentrated in wording, docs, and one behavioral nuance in code the previous round had just added. Further review rounds are unlikely to pay for themselves; the remaining risk in this change set is operational (the drain preconditions and deploy order), not defect-shaped. 🤖 Generated with Claude Code |
DRAFT — do not merge until the preconditions below hold. This is the largest piece of retiring the legacy central tunnel.
Removed:
DEFAULT_TUNNEL_ENDPOINTand every fallback to it.cdeAccessUrl— URLs are always<name>.<region>.tunnels.cde….getTunnelEndpoint's error/missing fallbacks: it now throws, andcreateServerfails the request with a clear Slack message. With no central tunnel left, falling back would mint a VM whose URL points at a dead host, so failing loudly is the only honest outcome.imageSupportsRegionalTunnel,parseImageTag,compareImageTags) and theREGIONAL_TUNNEL_MIN_IMAGE_TAGenv var (also dropped fromexample.env)./vm listno longer renders an access link for a CDE VM whose tags lacktunnel_endpoint— those predate regional tunnels and have no reachable URL.Preconditions — all must be true
tunnel_endpoint(companion: feat!: require tunnel_endpoint on every region (legacy tunnel removal) provisioner#236). CheckGET /v1/regionsfor any"tunnel_endpoint": null.GET /v1/listfor CDE VMs (those with acde_tokentag) whose tags either lacktunnel_endpointor set it totunnels.glueopshosted.com. Those VMs lose their/vm listlink (or get a wrong URL) the moment this merges — they must be drained first.Companion PRs: GlueOps/provisioner#236, GlueOps/codespaces#554.
🤖 Generated with Claude Code
https://claude.ai/code/session_01ErBUiAYTosnpbF9hvUj3Dn